package day05;

import java.util.Arrays;

public class ArrayDemo1 {
    public static void main(String[] args) {

        //1)数组的定义:
        //声明整型数组a，包含5个元素，每个元素都是int类型，默认值为0
        int[] a = new int[5];
        //声明浮点型数组d，包含10个元素，每个元素都是double类型，默认值为0.0
        double[] d = new double[10];
        //声明布尔型数组b，包含26个元素，每个元素都是boolean类型，默认值为false
        boolean[] b = new boolean[26];

        //2)数组的初始化:初始化数组中的元素
        int[] arr1 = new int[3]; //0,0,0
        int[] arr2 = {2,5,8}; //2,5,8
        int[] arr3 = new int[]{2,5,8}; //2,5,8
        int[] arr4;
        //arr4 = {2,5,8}; //编译错误，此方式只能声明同时初始化
        arr4 = new int[]{2,5,8}; //正确

        //3)数组的访问:访问的是数组中的元素  数组的长度即元素的个数
                      //通过数组名.length获取数组的长度
                      //通过下标/索引访问数组中的元素，从下标0开始，到n-1结束，n为数组的长度
        int[] arr = new int[3];
        System.out.println("数组的长度:"+arr.length); //3，arr为元素的个数 .length代表长度即元素个数

        System.out.println("数组第1个元素为:"+arr[0]); //0
        arr[0] = 100; //给第1个元素赋值为100
        arr[1] = 200; //给第2个元素赋值为200
        arr[2] = 300; //给第3个元素赋值为300
        //arr[0] = 400; //运行时会发生数组下标越界异常
        System.out.println(arr[2]); //300，输出最后一个元素的值
        //arr.length-1 为输出最后一个元素的值
        System.out.println(arr[arr.length-1]); //300，

        System.out.println("---------------------------------------------------");

        //4)数组的遍历/迭代:从头到尾挨个走一遍
        int[] brr = new int[10];
        for(int i=0;i<brr.length;i++){ //遍历brr数组
            //  brr[i] = 100;  //给每个元素赋值为100
            brr[i] = (int)(Math.random()*100); //给每个元素赋值为0到99的随机数  每次的随机数都不一样
            System.out.println(brr[i]); //输出每个元素的值
        }

        System.out.println("---------------------------------------------------");

        //5)数组的复制
        // ①使用System.arraycopy()方法可以实现数组的复制
        int[] f = {10,20,30,40,50};
        int[] g = new int[6];
        //f：源数组   1：源数组开始复制的下标   g：目标数组  0：开始复制到目标数组的下标  4：复制源数组的个数
        System.arraycopy(f,1,g,0,4);
        for (int i=0;i<g.length;i++){
            System.out.println(g[i]);
        }

        System.out.println("---------------------------------------------------");

        //②使用Arrays.copyOf()方法也可以实现数组的复制
        int[] h = {10,20,30,40,50};
        int[] j =  Arrays.copyOf(h,6);//灵活性差
        for(int i=0;i<j.length;i++){
            System.out.println(j[i]);
        }
        // h: 源数组  j:目标数组  6:目标数组的长度
        //若目标数组的长度大于源数组的长度，则末尾补默认值0
        //若目标数组的长度小于源数组的长度，则将末尾的元素去掉

        System.out.println("---------------------------------------------------");

        //6)数组的扩容：创建了一个更大的新的数组，并将数据复制进去
        //数组的长度在创建数组后是不可改变，数组元素的内存空间是连续的
        h = Arrays.copyOf(a,h.length+1);
        for(int i=0;i<h.length;i++){
            System.out.println(h[i]);
        }

    }
}
